package jp.co.nes.awssupport.test.utility;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import jp.co.nes.awssupport.common.utility.AppInfoUtil;
import jp.co.nes.awssupport.common.utility.AwsKmsHelper;

/**
 * JUnitで使用するデータベースコネクションユーティリティです。
 */
public class JUnitDbConnUtil {

    /** コネクション */
    private static Connection connection;

    /**
     * コネクションを取得します。
     */
    public static void connect() {
        String category = "Rds";
        String driver = AppInfoUtil.getVal(category, "JdbcDriver");
        String url = AppInfoUtil.getVal(category, "JdbcUrl");
        String user = AppInfoUtil.getVal(category, "JdbcUser");
        String password = null;
        String encryptPassword = AppInfoUtil.getVal(category, "EncryptJdbcPassword");
        if (encryptPassword == null) {
            password = AppInfoUtil.getVal(category, "JdbcPassword");
        } else {
            AwsKmsHelper helper = new AwsKmsHelper();
            password = helper.decrypt(encryptPassword);
        }
        try {
            Class.forName(driver);
            connection = DriverManager.getConnection(url, user, password);
            connection.setAutoCommit(false);
        } catch (ClassNotFoundException | SQLException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * コネクションをクローズします。
     */
    public static void close() {
        try {
            if (connection != null && !connection.isClosed()) {
                connection.close();
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * コネクションを返却します。
     *
     * @return コネクション
     */
    public static Connection getConn() {
        return connection;
    }

    /**
     * コミットします。
     */
    public static void commit() {
        try {
            connection.commit();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * ロールバックします。
     */
    public static void rollback() {
        try {
            connection.rollback();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 引数で引き渡されたテーブルの全データを削除します。
     *
     * @param tableName テーブル名
     */
    public static void delete(String tableName) {
        String sql = "delete from " + tableName;
        try (PreparedStatement delPs = getConn().prepareStatement(sql)) {
            delPs.executeUpdate();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}
